package Controller;

import DAO.MyDrawPane;
import DAO.NodeList;
import DAO.OpRecord;
import DAO.TreeNode;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.Pane;
import util.*;

import java.util.List;

import static util.LayoutUtil.SelectItem;


public class MainViewController {

    @FXML
    private MenuItem saveItem;   /* 保存 */
    @FXML
    private MenuItem createItem; /* 新建 */
    @FXML
    private MenuItem openItem;   /* 打开 */
    @FXML
    private MenuItem roundItem;
    @FXML
    private MenuItem recoverItem;
    @FXML
    private MenuItem item1;
    @FXML
    private MenuItem exportPngItem; /* 导出png格式 */
    @FXML
    private MenuItem exportMapItem; /* 导出思维导图格式 */
    @FXML
    public Pane drawPane; /* 绘图区 */
    @FXML
    public Pane blackPane;   /* 结构区 */

    ButtonUtil buttonUtil = new ButtonUtil();  /* 导入ButtonUtil */

    public static int item = 1;
    MyDrawPane myDrawPane = new MyDrawPane();

    private  String filename;
    @FXML
    public void initialize(){
        /**
         * 创建并初始化MyTreeView实例，并将其添加到drawPane和blackPane中。
         * 进行节点选择和缩放操作，以及设置布局。
         */
        MyTreeView myTreeView = new MyTreeView();
        drawPane.getChildren().add(myDrawPane); // 将myDrawPane添加到drawPane中
        blackPane.getChildren().add(MyTreeView.ap); // 将MyTreeView的静态成员ap添加到blackPane中
        setFatKey(); // 设置重点键值
        NodeChooseUtil.Click(); // 触发节点单击操作
        NodeChooseUtil.DoubleClick(); // 触发节点双击操作
        Zoom.zoom(); // 进行缩放操作
        FlowLayout(); // 设置布局为FlowLayout
    }

    // 菜单栏的快捷键
    void setFatKey(){
        createItem.setAccelerator(KeyCombination.keyCombination("Shortcut+n")); //TODO ctrl+n创建新的思维导图
        openItem.setAccelerator(KeyCombination.keyCombination("Shortcut+o"));   //TODO ctrl+o打开文件选择器
        saveItem.setAccelerator(KeyCombination.keyCombination("shortcut+s"));   //TODO ctrl+s保存思维导图
        roundItem.setAccelerator(KeyCombination.keyCombination("Shortcut+z"));  //TODO ctrl+z撤销操作
        recoverItem.setAccelerator(KeyCombination.keyCombination("Shortcut+x")); //TODO ctrl+x恢复操作
    }

    /* 打开文件 */
    @FXML
    private void handleButtonClick() {
        // 弹出文件选择器
        buttonUtil.openFile();
        // 清空画布
        MyDrawPane.g.getChildren().clear();
        // 清空撤销重做队列
        OpRecord.clear();
        MyDrawPane.draw();
        MyTreeView.setTreeView();
    }

    /* 新建思维导图 */
    @FXML
    private void createNewMap(){
        //若用户未保存文件，弹出对话框询问是否保存
        if(buttonUtil.getWorkingFile()==null){
            // 创建一个信息类型的Alert
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            // 设置对话框的标题
            alert.setTitle("信息提示");
            // 设置对话框的主要内容信息
            alert.setContentText("是否先保存当前文件");

            // 创建自定义的确定按钮
            alert.getDialogPane().getButtonTypes().setAll(ButtonType.YES,ButtonType.NO);

            // 显示对话框并等待用户关闭它
            ButtonType result = alert.showAndWait().orElse(null);

            if (result == ButtonType.YES) {
                // 保存文件
                saveMap();
            } else if (result == ButtonType.NO) {
                // 不保存文件
            } else {
                System.out.println("用户没有选择任何选项或对话框被关闭");
                return;     //没选择，不作操作
            }
        }
        //清空画布
        MyDrawPane.g.getChildren().clear();
        //清空节点列表
        NodeList.list.clear();
        //清空撤销重做队列
        OpRecord.clear();

        //更新当前工作文件
        ButtonUtil.setWorkingFile(null);
        MyDrawPane.draw();
        MyTreeView.setTreeView();
    }

    /* 保存思维导图 */
    @FXML
    private void saveMap(){
        // 如果用户选择了文件，则保存为思维导图格式文件
        buttonUtil.saveFile();
    }

    /**
     * 另存为
     */
    public void saveAS() {
        buttonUtil.saveAs();
    }

    /* 导出为png */
    @FXML
    private void exportaspng() {
        // 如果用户选择了文件，则导出为 PNG
        PhotoUtil.export("png");
    }

    /*导出为jpg*/
    public void exportasjpg() {
        // 如果用户选择了文件，则导出为 JPG
        PhotoUtil.export("jpg");
    }

    /* 添加思维导图子节点 */
    @FXML
    private void addChildrenNode(ActionEvent actionEvent) {
        if(NodeList.list.isEmpty()){  // 如果list中是空的，则思维导图内容为空，需创建一个根节点
            TreeUtil.createRoot(); // 创建根节点并将其添加到list和drawPane的布局上
        }else {
            if(NodeChooseUtil.node.isClick()){
                TreeNode node= NodeChooseUtil.node;  // 该节点为选中节点
                TreeUtil.addNode(node);
            }

        }
        SelectItem(item);

        MyDrawPane.draw(); // 重新绘制思维导图实现刷新
        MyTreeView.setTreeView();
    }

    /**
     * 添加一个节点到树中
     */
    @FXML
    private void addNode(){
        // 检查是否已选择节点
        if (NodeChooseUtil.node.isClick()){
            TreeNode node=NodeChooseUtil.node;
            TreeNode p = NodeList.getParent(node); // 获取当前节点的父节点

            // 如果当前节点不是树的根节点，则将其添加到父节点中
            if(node != NodeList.getRoot()){
                TreeUtil.addNode(p);
            }

            // 布局
            SelectItem(item);

            // 更新绘图区域和树视图
            MyDrawPane.draw();
            MyTreeView.setTreeView();
        }
    }

    /* 删除思维导图节点 */
    @FXML
    private void deleteNodeButton(){
        //取到选中节点
        TreeNode node=NodeChooseUtil.node;
        //删除
        TreeUtil.deleteNode(node);
        //重新绘制
        MyDrawPane.draw();
        MyTreeView.setTreeView();
    }

    /* 撤回操作 */
    @FXML
    private void round(){
        //取新list
        List<TreeNode> list = OpRecord.undo();
        if(list!=null) {
            //更新
            NodeList.list = list;
            try {
                MyTreeView.setTreeView();
            } catch (Exception e) {
                e.printStackTrace();
            }
            MyDrawPane.redraw();
        }
    }

    /* 恢复操作 */
    @FXML
    private void recover(){
        //取新list
        List<TreeNode> list = OpRecord.redo();
        if(list!=null) {
            //更新
            NodeList.list = list;
            try {
                MyTreeView.setTreeView();
            } catch (Exception e) {
                e.printStackTrace();
            }

            MyDrawPane.redraw();
        }
    }

    /* 自由布局 */
    @FXML
    private void FlowLayout(){
        item = 1;
        SelectItem(item);
        MyDrawPane.draw();
    }

    /* 左侧布局 */
    @FXML
    private void LLayout(){
        item = 2;
        SelectItem(item);
        MyDrawPane.draw();
    }

    /* 右侧布局 */
    @FXML
    private void RLayout(){
        item = 3;
        SelectItem(item);
        MyDrawPane.draw();
    }

    /*清空所有结点*/
    @FXML
    private void clearNodeButton() {
        NodeList.list.clear();
        MyDrawPane.draw();
        MyTreeView.setTreeView();
    }

}


